home *** CD-ROM | disk | FTP | other *** search
/ The CICA Windows Explosion! / The CICA Windows Explosion! - Disc 2.iso / nt / source.exe / POSIX / BSDPSX / STRMODE.C < prev    next >
C/C++ Source or Header  |  1992-07-30  |  4KB  |  165 lines

  1. /*-
  2.  * Copyright (c) 1990 The Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *    This product includes software developed by the University of
  16.  *    California, Berkeley and its contributors.
  17.  * 4. Neither the name of the University nor the names of its contributors
  18.  *    may be used to endorse or promote products derived from this software
  19.  *    without specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  */
  33.  
  34. #if defined(LIBC_SCCS) && !defined(lint)
  35. static char sccsid[] = "@(#)strmode.c    5.3 (Berkeley) 5/18/90";
  36. #endif /* LIBC_SCCS and not lint */
  37.  
  38.  
  39. #include <sys/types.h>
  40. #include <sys/stat.h>
  41. #include <string.h>
  42.  
  43. void
  44. strmode(mode, p)
  45.     register mode_t mode;
  46.     register char *p;
  47. {
  48. //#ifdef ENHANCE 
  49.     /* print type */ 
  50.     switch (mode & S_IFMT) 
  51.     { 
  52.     case S_IFDIR:            /* directory */
  53.         *p++ = 'd';
  54.         break;
  55.     case S_IFCHR:            /* character special */
  56.         *p++ = 'c';
  57.         break;
  58.     case S_IFBLK:            /* block special */
  59.         *p++ = 'b';
  60.         break;
  61.     case S_IFREG:            /* regular */
  62.         *p++ = '-';
  63.         break;
  64.  
  65. #ifndef _POSIX_SOURCE
  66.     case S_IFLNK:            /* symbolic link */
  67.         *p++ = 'l';
  68.         break;
  69.     case S_IFSOCK:            /* socket */
  70.         *p++ = 's';
  71.         break;
  72. #endif
  73.  
  74. #ifdef S_IFIFO
  75.     case S_IFIFO:             /* fifo */ 
  76.         *p++ = 'p';
  77.         break;
  78. #endif
  79.  
  80.     default:            /* unknown */
  81.         *p++ = '?';
  82.         break;
  83.     }
  84. //#endif 
  85.     /* usr */
  86.     if (mode & S_IRUSR)
  87.         *p++ = 'r';
  88.     else
  89.         *p++ = '-';
  90.     if (mode & S_IWUSR)
  91.         *p++ = 'w';
  92.     else
  93.         *p++ = '-';
  94.     switch (mode & (S_IXUSR | S_ISUID)) {
  95.     case 0:
  96.         *p++ = '-';
  97.         break;
  98.     case S_IXUSR:
  99.         *p++ = 'x';
  100.         break;
  101.     case S_ISUID:
  102.         *p++ = 'S';
  103.         break;
  104.     case S_IXUSR | S_ISUID:
  105.         *p++ = 's';
  106.         break;
  107.     }
  108.     /* group */
  109.     if (mode & S_IRGRP)
  110.         *p++ = 'r';
  111.     else
  112.         *p++ = '-';
  113.     if (mode & S_IWGRP)
  114.         *p++ = 'w';
  115.     else
  116.         *p++ = '-';
  117.     switch (mode & (S_IXGRP | S_ISGID)) {
  118.     case 0:
  119.         *p++ = '-';
  120.         break;
  121.     case S_IXGRP:
  122.         *p++ = 'x';
  123.         break;
  124.     case S_ISGID:
  125.         *p++ = 'S';
  126.         break;
  127.     case S_IXGRP | S_ISGID:
  128.         *p++ = 's';
  129.         break;
  130.     }
  131.     /* other */
  132.     if (mode & S_IROTH)
  133.         *p++ = 'r';
  134.     else
  135.         *p++ = '-';
  136.     if (mode & S_IWOTH)
  137.         *p++ = 'w';
  138.     else
  139.         *p++ = '-';
  140. //#ifdef ENHANCE
  141. #ifdef _POSIX_SOURCE
  142.     switch (mode & (S_IXOTH)) {
  143. #else
  144.     switch (mode & (S_IXOTH | S_ISVTX)) {
  145. #endif
  146.     case 0:
  147.         *p++ = '-';
  148.         break;
  149.     case S_IXOTH:
  150.         *p++ = 'x';
  151.         break;
  152. #ifndef _POSIX_SOURCE
  153.     case S_ISVTX:
  154.         *p++ = 'T';
  155.         break;
  156.     case S_IXOTH | S_ISVTX:
  157.         *p++ = 't';
  158.         break;
  159. #endif
  160.     }
  161. //#endif
  162.     *p++ = ' ';        /* will be a '+' if ACL's implemented */
  163.     *p = '\0';
  164. }
  165.